import mysql.connector #Python的MySQL官方连接器
from mysql.connector import Error #MySQL连接器定义的异常类，用于捕获数据库操作中的错误

class DBUtils:
    def __init__(self, host='localhost', database='bank system', user='root', password='1234',port =3306): #类初始化
        self.host = host
        self.database = database
        self.user = user
        self.password = password
        self.port = 3306
        self.connection = None
        print(f"正在连接数据库: host={self.host}, db={self.database}, user={self.user}")

    def connect(self): #尝试建立到MySQL数据库的连接
        try:
            self.connection = mysql.connector.connect(
                host=self.host,
                database=self.database,
                user=self.user,
                password=self.password
            ) #使用mysql.connector.connect()方法创建连接
            if self.connection.is_connected():
                print("成功连接到MySQL数据库")
        except Error as e:
            print(f"连接错误: {e}")

    def is_connected(self):
        """检查连接状态"""
        return self.connection and self.connection.is_connected()

    def disconnect(self): #安全地关闭数据库连接
        if self.connection and self.connection.is_connected():#首先检查连接是否存在且仍然活跃
            self.connection.close()#关闭
            print("数据库连接已关闭")

    def execute_query(self, query, params=None, fetch=True): #query: 要执行的SQL语句字符串，params: 可选的参数元组，用于参数化查询，fetch: 布尔值，决定是否获取结果(对于SELECT查询)
        cursor = None
        try:
            cursor = self.connection.cursor(dictionary=True) #创建字典类型的游标(dictionary=True)，这样返回的结果会是字典形式而非元组
            cursor.execute(query, params or ()) #执行SQL查询，使用参数化查询防止SQL注入

            if not fetch:
                self.connection.commit()

            if fetch: #根据查询类型和fetch参数决定如何处理结果：如果是SELECT查询且fetch=True，返回所有结果(fetchall()) ，否则，提交事务并返回受影响的行数(rowcount)
                if query.strip().upper().startswith('SELECT'):
                    return cursor.fetchall()
                else:
                    self.connection.commit()
                    return cursor.rowcount
            else:
                self.connection.commit()
                return cursor.rowcount
        except Error as e: #异常处理：捕获并打印任何数据库错误
            print(f"查询执行错误: {e}")
            return None
        finally: #finally块确保游标总是被关闭，防止资源泄漏
            if cursor:
                cursor.close()